#pragma once
#include "SyntaxParser.hpp"
#include <queue>
#include <utility>
namespace Level4
{
	class ExpressionNode;
	class AssignExpressionOperationNode;
	class StoreExpressionOperationNode;
}
namespace Level5
{
	class WaterDropSyntaxParser final :
		public SyntaxParser
	{
		std::list<Level4::Node*>* nodes;
		std::deque<Token> tokenQueue;
		std::list<Level5::Preprocessor::Token>::iterator iter;
		//Variable* variable;
		std::list<std::pair<std::u32string, std::u32string>> variables;
		std::list<Class*> classes;
		std::list<Level5::Preprocessor::Token>* tokens;
		//Variable* ParseVariable(std::deque<Token>* tokenQueue);
		Level4::ExpressionNode* ParseExpressionNode();
		Level4::AssignExpressionOperationNode* ParseAssignExpressionOperationNode();
		Level4::StoreExpressionOperationNode* ParseStoreExpressionOperationNode();
	public:
		virtual std::list<Level4::Node*>* operator()(std::list<Level5::Preprocessor::Token>*)override final;
		virtual ~WaterDropSyntaxParser()override final;
	};
}